LuaJIT
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
Contents
• History
• Tracing
• DynASM
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
History
The LuaJIT project was started in 2005 by developer Mike Pall, released under the MIT open source license.cite-ref-4[4]
The second major release of the compiler, 2.0.0, featured major performance increases.cite-ref-5[5]
LuaJIT uses rolling releases. Mike Pall, the creator and maintainer recommends using the tip of the v2.1 branch, and does not believe in releases.cite-ref-6[6]
Mike Pall resigned in 2015 making only occasional patching to the future 2.1 version since then.cite-ref-7[7]
Notable users
• Neovim, a text editor based on vim that allows the use of Lua for plugins and configurationcite-ref-10[10]
• Kong, a web API gatewaycite-ref-11[11]
Performance
LuaJIT includes a Foreign Function Interface compatible with C data structures. Its use is encouraged for numerical computation.cite-ref-numcomp-16-0[16]
Tracing
LuaJIT is a tracing just-in-time compiler. LuaJIT chooses loops and function calls as trace anchors to begin recording possible hot paths. Function calls will require twice as many invocations to begin recording as a loop. Once LuaJIT begins recording, all control flow, including jumps and calls, are inlined to form a linear trace. All executed bytecode instructions are stored and incrementally converted into LuaJIT's static single-assignment intermediate representation. LuaJIT's trace compiler is often capable of inlining and removing dispatches from object orientation, operators, and type modifications.cite-ref-17[17]
Internal representation
LuaJIT uses two types of internal representation. A stack-based bytecode is used for the interpreter, and a static single-assignment form is used for the just-in-time compiler. The interpreter bytecode is frequently patched by the JIT compiler, often to begin executing a compiled trace or to mark a segment of bytecode for causing too many trace aborts.cite-ref-cern1-15-1[15]
-- Loop with if-statement
local x = 0
for i=1,1e4 do
x = x + 11
if i%10 == 0 then -- if-statement
x = x + 22
end
x = x + 33
end
---- TRACE 1 start Ex.lua:5
---- TRACE 1 IR
0001 int SLOAD #2 CI
0002 > num SLOAD #1 T
0003 num ADD 0002 +11
0004 int MOD 0001 +10
0005 > int NE 0004 +0
0006 + num ADD 0003 +33
0007 + int ADD 0001 +1
0008 > int LE 0007 +10000
0009 ------ LOOP ------------
0010 num ADD 0006 +11
0011 int MOD 0007 +10
0012 > int NE 0011 +0
0013 + num ADD 0010 +33
0014 + int ADD 0007 +1
0015 > int LE 0014 +10000
0016 int PHI 0007 0014
0017 num PHI 0006 0013
---- TRACE 1 stop -> loop
---- TRACE 2 start 1/4 Ex.lua:8
---- TRACE 2 IR
0001 num SLOAD #1 PI
0002 int SLOAD #2 PI
0003 num ADD 0001 +22
0004 num ADD 0003 +33
0005 int ADD 0002 +1
0006 > int LE 0005 +10000
0007 num CONV 0005 num.int
---- TRACE 2 stop -> 1
Extensions
LuaJIT adds several extensions to its base implementation, Lua 5.1, most of which do not break compatibility.cite-ref-18[18]
• "BitOp" for binary operations on unsigned 32-bit integers (these operations are also compiled by the just-in-time compiler)cite-ref-19[19]
• "CoCo", which allows the VM to be fully resumable across all contextscite-ref-20[20]
• A foreign function interfacecite-ref-21[21]
• Portable bytecode (regardless of architecture, word size, or endianness, not version)cite-ref-22[22]
DynASM
DynASM is a lightweight preprocessor for C that provides its own flavor of inline assembler, independent of the C compiler. DynASM replaces assembly code in C files with runtime writes to a 'code buffer', such that a developer may generate and then evoke code at runtime from a C program. It was created for LuaJIT 1.0.0 to make developing the just-in-time compiler easier.
DynASM includes a bare-bones C header file which is used at compile time for logic the preprocessor generates. The actual preprocessor is written in Lua.
References
cite-note-11. LuaJIT tags
cite-note-22. "LuaJIT". LuaJIT. Retrieved 25 February 2022.
cite-note-github1-33. "LuaJIT/COPYRIGHT at v2.1 · LuaJIT/LuaJIT". GitHub. 7 January 2022.
cite-note-44. ↑ "The LuaJIT Project". luajit.org. Retrieved 2023-06-17.
cite-note-55. ↑ citerefpallPall, Mike. "Re: [ANN] llvm-lua 1.0". lua-users.org. Retrieved 25 February 2022.
cite-note-66. ↑ "Project status - Issue #665 - LuaJIT/LuaJIT". GitHub. Retrieved 3 February 2023.
cite-note-77. ↑ "[ANN] Looking for new LuaJIT maintainers - luajit - FreeLists". www.freelists.org. Retrieved 2023-03-29.
cite-note-88. ↑ citerefdeniauDeniau, Laurent. "Lua(Jit) for computing accelerator beam physics". CERN Document Server. CERN. Retrieved 25 February 2022.
cite-note-99. ↑ "OpenResty® - Official Site". openresty.org.
cite-note-1010. ↑ "Lua - Neovim docs". neovim.io. Retrieved 2024-05-07.
cite-note-1111. ↑ "Kong/kong". GitHub. Kong. 25 February 2022. Retrieved 25 February 2022.
cite-note-1212. ↑ "Helping to make Luajit faster". blog.cloudflare.com. 19 October 2017. Retrieved 25 February 2022.
cite-note-1313. ↑ "LuaJIT Performance".
cite-note-1414. ↑ "Laurence Tratt: The Impact of Meta-Tracing on VM Design and Implementation". tratt.net. Retrieved 2 March 2022.
cite-note-cern1-1515. ↑ citerefd-andrea2019d'Andrea, Laurent (2019). Behavioural Analysis of Tracing JIT Compiler Embedded in the Methodical Accelerator Design Software (Thesis). CERN. Retrieved 31 July 2022.
cite-note-numcomp-1616. ↑ citerefpallPall, Mike. "Tuning numerical computations for LuaJIT (was Re: [ANN] Sci-1.0-beta1) - luajit - FreeLists". www.freelists.org.
cite-note-1717. ↑ Rottenkolber, Max. "Later Binding: Just-in-Time Compilation of a Younger Dynamic Programming Language." ELS. 2020
cite-note-1818. ↑ "Extensions". LuaJIT. Retrieved 25 February 2022.
cite-note-1919. ↑ "BitOp Semantics". LuaJIT. Retrieved 25 February 2022.
cite-note-2020. ↑ "Coco - True C Coroutines". LuaJIT. Retrieved 25 February 2022.
cite-note-2121. ↑ "FFI Library". LuaJIT. Retrieved 25 February 2022.
cite-note-2222. ↑ "Extensions". luajit.org. Retrieved 2022-08-25.
cite-note-234. "DynASM Features". DynASM. Retrieved 25 February 2022.